package br.com.esporte.negocios.fachada.imp;

import java.util.Collection;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.esporte.negocios.controlador.imp.ControladorDiaPraticadoGrupo;
import br.com.esporte.negocios.controlador.imp.ControladorGrupo;
import br.com.esporte.negocios.controlador.imp.ControladorGrupoEsporteGrupo;
import br.com.esporte.negocios.controlador.imp.ControladorGrupoEsporteIndividual;
import br.com.esporte.negocios.controlador.imp.ControladorMail;
import br.com.esporte.negocios.controlador.imp.ControladorPartida;
import br.com.esporte.negocios.controlador.imp.ControladorRegra;
import br.com.esporte.negocios.controlador.imp.ControladorUsuario;
import br.com.esporte.negocios.entidade.imp.DiaPraticadoGrupo;
import br.com.esporte.negocios.entidade.imp.Grupo;
import br.com.esporte.negocios.entidade.imp.GrupoEsporteGrupo;
import br.com.esporte.negocios.entidade.imp.GrupoEsporteIndividual;
import br.com.esporte.negocios.entidade.imp.Partida;
import br.com.esporte.negocios.entidade.imp.Regra;
import br.com.esporte.negocios.entidade.imp.Usuario;
import br.com.esporte.negocios.entidade.util.TipoEsporteGrupoEnum;
import br.com.esporte.negocios.fachada.IFachada;
import br.com.esporte.repositorio.filtro.imp.FiltroDiaPraticadoGrupo;
import br.com.esporte.repositorio.filtro.imp.FiltroGrupo;
import br.com.esporte.repositorio.filtro.imp.FiltroGrupoEsporteGrupo;
import br.com.esporte.repositorio.filtro.imp.FiltroGrupoEsporteIndividual;
import br.com.esporte.repositorio.filtro.imp.FiltroPartida;
import br.com.esporte.repositorio.filtro.imp.FiltroRegra;
import br.com.esporte.repositorio.filtro.imp.FiltroUsuario;

/**
 * @author Milton Domingues
 */
@Service("fachada")
public class Fachada implements IFachada {

	@Autowired
	private ControladorPartida controladorPartida;

	@Autowired
	private ControladorDiaPraticadoGrupo controladorDiaPraticadoGrupo;

	@Autowired
	private ControladorUsuario controladorUsuario;

	@Autowired
	private ControladorMail controladorMail;

	@Autowired
	private ControladorGrupoEsporteGrupo controladorGrupoEsporteGrupo;

	@Autowired
	private ControladorGrupo controladorGrupo;

	@Autowired
	private ControladorRegra controladorRegra;

	@Autowired
	private ControladorGrupoEsporteIndividual controladorGrupoEsporteIndividual;

	private Fachada() {

	}

	@Override
	public void alterarDiaPraticadoGrupo(DiaPraticadoGrupo dia, Usuario usuario) {
		this.controladorDiaPraticadoGrupo.alterar(dia, usuario);
	}

	@Override
	public void alterarGrupoEsporteGrupo(GrupoEsporteGrupo grupo, Usuario usuario) {
		this.controladorGrupoEsporteGrupo.alterar(grupo, usuario);
	}

	@Override
	public void alterarGrupoEsporteIndividual(GrupoEsporteIndividual grupo, Usuario usuario) {
		this.controladorGrupoEsporteIndividual.alterar(grupo, usuario);
	}

	@Override
	public void alterarPartida(Partida partida, Usuario usuario) {
		this.controladorPartida.alterar(partida, usuario);
	}

	@Override
	public void alterarRegra(Regra regra, Usuario usuario) {
		this.controladorRegra.alterar(regra, usuario);
	}

	public void alterarUsuario(Usuario usuario) {
		this.controladorUsuario.alterar(usuario, usuario);
	}

	@Override
	public DiaPraticadoGrupo buscarDiaPraticadoGrupo(Long id) {
		return this.controladorDiaPraticadoGrupo.buscar(id);
	}

	@Override
	public GrupoEsporteGrupo buscarGrupoEsporteGrupo(Long id) {
		return this.controladorGrupoEsporteGrupo.buscar(id);
	}

	@Override
	public GrupoEsporteIndividual buscarGrupoEsporteIndividual(Long id) {
		return this.controladorGrupoEsporteIndividual.buscar(id);
	}

	@Override
	public Partida buscarPartida(Long id) {
		return this.controladorPartida.buscar(id);
	}

	@Override
	public Usuario buscarUsuario(Long id) {
		return this.controladorUsuario.buscar(id);
	}

	@Override
	public Collection<DiaPraticadoGrupo> consultar(FiltroDiaPraticadoGrupo filtro) {
		return this.controladorDiaPraticadoGrupo.consultar(filtro);
	}

	@Override
	public Collection<Grupo> consultar(FiltroGrupo filtro) {
		return this.controladorGrupo.consultar(filtro);
	}

	@Override
	public Collection<GrupoEsporteGrupo> consultar(FiltroGrupoEsporteGrupo filtro) {
		return this.controladorGrupoEsporteGrupo.consultar(filtro);
	}

	@Override
	public Collection<GrupoEsporteIndividual> consultar(FiltroGrupoEsporteIndividual filtro) {
		return this.controladorGrupoEsporteIndividual.consultar(filtro);
	}

	@Override
	public Collection<Partida> consultar(FiltroPartida filtro) {
		return this.controladorPartida.consultar(filtro);
	}

	@Override
	public Collection<DiaPraticadoGrupo> consultarDiaPraticadoGrupo(FiltroDiaPraticadoGrupo filtro) {
		return this.controladorDiaPraticadoGrupo.consultar(filtro);
	}

	@Override
	public List<GrupoEsporteGrupo> consultarEsporteGrupoUsuario(TipoEsporteGrupoEnum tipo, Usuario usuario){
		return this.controladorGrupoEsporteGrupo.consultarEsporteGrupoUsuario(tipo, usuario);
	}

	@Override
	public Collection<Regra> consultarRegra(FiltroRegra filtroRegra) {
		return this.controladorRegra.consultar(filtroRegra);
	}

	@Override
	public Collection<Usuario> consultarUsuario(FiltroUsuario filtroUsuario) {
		return this.controladorUsuario.consultar(filtroUsuario);
	}

	@Override
	public List<Usuario> consultarUsuarioGrupo(Grupo grupo){
		return this.controladorUsuario.consultarUsuarioGrupo(grupo);
	}

	@Override
	public void enviarEmail(String texto, Usuario usuario) {
		this.controladorMail.sendMailText(texto, usuario);
	}

	@Override
	public void inserirDiaPraticadoGrupo(DiaPraticadoGrupo dia, Usuario usuario) {
		this.controladorDiaPraticadoGrupo.inserir(dia, usuario);
	}

	@Override
	public void inserirGrupoEsporteGrupo(GrupoEsporteGrupo grupo, Usuario usuario) {
		this.controladorGrupoEsporteGrupo.inserir(grupo, usuario);
	}

	@Override
	public void inserirGrupoEsporteIndividual(GrupoEsporteIndividual grupo, Usuario usuario) {
		this.controladorGrupoEsporteIndividual.inserir(grupo, usuario);
	}

	@Override
	public void inserirPartida(Partida partida, Usuario usuario) {
		this.controladorPartida.inserir(partida, usuario);
	}

	@Override
	public void inserirRegra(Regra regra, Usuario usuario) {
		this.controladorRegra.inserir(regra, usuario);
	}

	@Override
	public void inserirUsuario(Usuario usuario) {
		this.controladorUsuario.inserir(usuario, usuario);
	}

	@Override
	public Usuario loadUsuario(Long id){
		return this.controladorUsuario.load(id);
	}

	@Override
	public void removerUsuario(Usuario usuario) {
		this.controladorUsuario.remover(usuario);
	}

	@Override
	public void validarLogin(Usuario usuario) {
		this.controladorUsuario.validarLogin(usuario);
	}

}
